-- 2022-8-1

-- 由于函数是一种 "第一类值" ，因此一个显而易见的结构就是，函数不仅可以被存储在全局变量中，还可以被存储在表字段和局部变量中


-- 第一种
Lib = {}
Lib.foo = function (x,y) return x + y end
Lib.goo = function (x,y) return x - y end
print(Lib.foo(2,3),Lib.goo(2,3))

-- 第二种
Lib = {
foo = function (x,y) return x + y end,
goo = function (x,y) return x - y end
}
print(Lib.foo(2,3),Lib.goo(2,3))

-- 第三种
lib = {}
function lib.foo (x,y) return x + y end
function lib.goo (x,y) return x - y end
print(Lib.foo(2,3),Lib.goo(2,3))

-- 当把一个函数存储到局部变量时，就得到了一个局部函数，即一个被限定在指定作用域使用的函数
-- 局部函数对于包而言尤其有用:
--      由于Lua语言将每个程序的作为一个函数处理，所以在一段程序在声明的函数就是局部函数，这些局部函数指针该程序段中可见
--      词法界定保证了程序段中的其他函数可以使用这些局部函数

-- 对于这种局部函数的使用，Lua语言提供了一种语法糖
-- local function f (params)
--     -- body
-- end

-- 在定义局部递归函数时，由于原来的方法不适用，所以有时极易出错
-- local fact = function (n)
--     if n == 0 then
--         return 1
--     else
--         return n*fact(n-1) -- 出现问题了，赋值由右向左，此时fact还未定义
--     end
-- end
-- 因此我们需要先定义local fact来解决这个问题